<?php
class ItemsModel extends BaseModel
{

	private $MAX_LENGTH = 255;
	private $MIN_LENGTH = 1;
	
	public function fetchRandomItem($dict_id)
	{
		if (session_status() !== PHP_SESSION_ACTIVE) 
		{
			session_start();
		}
		
		if (isset($_SESSION['current_user'])) 
		{
			// user is logged in
			$user_id = $_SESSION['current_user'];
		}
		else 
		{
			// user is not logged in
			$user_id = 0; // such a user doesn't exist
			$dict_id = 0; // such a dict doesn't exist
		}
		
		// patikrinti, ar šitas useris gali matyti dict_id
		if ($user_id===0 || DbCommunicator::userAdmittedToDict($this->pdo, $user_id, $dict_id)) {
			// partempti atsitiktinį žodį iš dict_id
			$randomRow = DbCommunicator::fetchRandomRow($this->pdo, $dict_id);
			return json_encode($randomRow);
		}
		else {
			return "{}";//empty row
		}
	}
	
	public function fetchItemsByString($str)
	{
		$dbParam = $this->makeSafe($str);
		if (!$dbParam)
			exit();
		$items = DbCommunicator::fetchItemsByString($this->pdo, $dbParam);
		return json_encode($items);
	}
	
	public function insertItem($mother, $fore)
	{
		if ($mother && $fore)
		{
			$mother = trim(strip_tags($mother));
			$fore = trim(strip_tags($fore));
			
			if (strlen($mother) < $this->MIN_LENGTH ||
				strlen($fore) < $this->MIN_LENGTH || 
				strlen($mother) > $this->MAX_LENGTH || 
				strlen($fore) > $this->MAX_LENGTH)
			{
				$returnObject['messages'][] = "Neįrašytas, nes netiko frazės ilgis";
				$returnObject['success'] = false;
			}
			else if (DbCommunicator::isInDb($this->pdo, $mother))
			{
				$returnObject['messages'][] = "Neįrašytas - frazė gimtąja kalba jau yra duomenų bazėje";
				$returnObject['success'] = false;
			}
			else if (DbCommunicator::isInDb($this->pdo, $fore))
			{
				$returnObject['messages'][] = "Neįrašytas - frazė užsienio kalba jau yra duomenų bazėje";
				$returnObject['success'] = false;
			}
			else if (DbCommunicator::insertItem($this->pdo, $mother, $fore))
			{
				$returnObject['messages'][] = "Įrašytas";
				$returnObject['success'] = true;
			}
			else
			{
				$returnObject['messages'][] = "Neįrašytas dėl nežinomų priežasčių";
				$returnObject['success'] = false;
			}
		}
		else
		{
				$returnObject['messages'][] = "Neįrašytas, nes mes abu žinome, kad tu pisi protą";
				$returnObject['success'] = false;
		}
		return json_encode($returnObject);
	}
	
	public function deleteItem($id)
	{		
		if ($id)
		{
			if (is_numeric($id) && $id > 0 && DbCommunicator::deleteItemById($this->pdo, $id))
			{
				$returnObject['messages'][] = "Ištrinta";
				$returnObject['success'] = true;
			}
			else
			{
				$returnObject['messages'][] = "Neištrinta dėl nežinomų priežasčių";
				$returnObject['success'] = false;
			}
		}
		return json_encode($returnObject);
	}
	
	public function updateItem($id, $mother, $fore)
	{		
		if ($id && $mother && $fore)
		{
			$mother = trim(strip_tags($mother));
			$fore = trim(strip_tags($fore));
			
			if (!is_numeric($id) || $id < 1)
			{
				$returnObject['messages'][] = "Nepakeista, nes tu pisi protą";
				$returnObject['success'] = false;
			}
			else if (strlen($mother) < $this->MIN_LENGTH || 
					strlen($fore) < $this->MIN_LENGTH || 
					strlen($mother) > $this->MAX_LENGTH || 
					strlen($fore) > $this->MAX_LENGTH)
			{
				$returnObject['messages'][] = "Nepakeista, nes netiko frazės ilgis";
				$returnObject['success'] = false;				
			}
			else if (DbCommunicator::isInDbDifferentId($this->pdo, $mother, $id))
			{
				$returnObject['messages'][] = "Nepakeista - frazė gimtąja kalba jau yra duomenų bazėje";
				$returnObject['success'] = false;				
			}
			else if (DbCommunicator::isInDbDifferentId($this->pdo, $fore, $id))
			{
				$returnObject['messages'][] = "Nepakeista - frazė užsienio kalba jau yra duomenų bazėje";
				$returnObject['success'] = false;				
			}
			else if (DbCommunicator::updateItem($this->pdo, $id, $mother, $fore))
			{
				$returnObject['messages'][] = "Pakeista";
				$returnObject['success'] = true;				
			}
			else
			{
				$returnObject['messages'][] = "Nepakeista dėl neaiškių priežasčių";
				$returnObject['success'] = false;				
			}
		}
		else 
		{
			$returnObject['messages'][] = "Nepakeista, nes trūksta duomenų";
			$returnObject['success'] = false;			
		}
		return json_encode($returnObject);
	}
	
	public function insertBatch($batchString)
	{
		$MAX_RECORDS = 255;
		$CHUNKS_DELIMITER = "|";		
		
		$returnObject['success'] = false;
		
		if (!$batchString || !($text = trim(strip_tags($batchString))))
		{
			$returnObject['messages'][] = "Niekas neįrašyta, nes nebuvo ką įrašyti";
		}
		else
		{
			$rows = explode("\n", $text, $MAX_RECORDS + 1);
			
			for($i = 0; $i < $MAX_RECORDS && $i < count($rows); $i++)
			{
				$chunks = explode($CHUNKS_DELIMITER, $rows[$i], 3);
				if (count($chunks) == 2)
				{
					$mother = trim($chunks[0]);
					$fore = trim($chunks[1]);
					
					$len = 10;
					$lenMother = strlen($mother);
					$lenFore = strlen($fore);
					$subMother = $lenMother < $len ? $mother : substr($mother, 0, $len) . "...";
					$subFore = $lenFore < $len ? $fore : substr($fore, 0, $len) . "...";
					
					$title = ($i + 1) . " ($subMother | $subFore)"; // eilutės numeris, skaičiuojant nuo 1
					
					if ($lenMother < $this->MIN_LENGTH || 
						$lenFore < $this->MIN_LENGTH || 
						$lenMother > $this->MAX_LENGTH || 
						$lenFore > $this->MAX_LENGTH)
					{
						$returnObject['messages'][] = "$title - neįrašyta, netiko frazės ilgis";
						$returnObject['badrows'][] = $rows[$i];
					}
					else if (DbCommunicator::isInDb($this->pdo, $mother))
					{
						$returnObject['messages'][] = "$title - neįrašyta, frazė gimtąja kalba jau yra duomenų bazėje";
						$returnObject['badrows'][] = $rows[$i];
					}
					else if (DbCommunicator::isInDb($this->pdo, $fore))
					{
						$returnObject['messages'][] = "$title - neįrašyta, frazė užsienio kalba jau yra duomenų bazėje";
						$returnObject['badrows'][] = $rows[$i];
						
					}
					else if (!DbCommunicator::insertItem($this->pdo, $mother, $fore))
					{
						$returnObject['messages'][] = "$title - neįrašytas dėl neaiškių priežasčių";
						$returnObject['badrows'][] = $rows[$i];
					}
					else
					{
						// $messages[] = "$title - įrašytas.";
					}
				}
				else
				{
					$returnObject['messages'][] = ($i + 1) . " (" . substr($rows[$i], 0, $len * 2) . "...) - neįrašyta, nes blogas formatas";
					$returnObject['badrows'][] = $rows[$i];
				}
			}
		}
		
		if (!isset($returnObject['messages']) || count($returnObject['messages']) == 0)
		{
			$returnObject['messages'][] = "Įrašyti visi.";
			$returnObject['badrows'][] = "";
			$returnObject['success'] = true;
		}
		
		return json_encode($returnObject);
	}
	
	public function truncateTable()
	{
		if (DbCommunicator::truncateTable($this->pdo))
		{
			$returnObject['messages'][] = "Lentelės įrašai ištrinti";
			$returnObject['success'] = true;
		}
		else
		{
			$returnObject['messages'][] = "Nepavyko ištrinti dėl nežinomų priežasčių";
			$returnObject['success'] = false;
		}
		
		return json_encode($returnObject);
	}
	
	public function dumpTable()
	{
		$filename = "wordage_db.txt";
		
		@apache_setenv('no-gzip', 1);
		@ini_set('zlib.output_compression', 'Off');		
		header("Pragma: public");
		header("Expires: -1");
		header("Cache-Control: public, no-cache, must-revalidate, post-check=0, pre-check=0");
		header("Content-Disposition: attachment; filename=$filename");
		header("Content-Type: text/plain");
		ob_clean();
		echo $this->dumpAsPairs();
		exit;
	}
	
	private function dumpAsPairs()
	{
		$allRows = DbCommunicator::fetchAllRows($this->pdo);
		$rows = array();
		foreach($allRows as $row)
		{
			$rows[] = $row['mother'] . " | " . $row['fore'];
		}
		return implode("\n", $rows);		
	}
}